package hibernate;

import beans.Nodo;
import beans.Usuario;
import java.util.Hashtable;
import java.util.List;

/**
 *
 * @author Antonio
 */
public class UsuarioBD extends PreparacionHibernate {

    //Atributo usuario
    private Usuario usuario;

    /**
     *Metodo observador
     * @return devuelve el usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     *Método modificador
     * @param usuario 
     * Usuario que se procesa
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**Constructor de la clase
     *@param usuario 
     * Usuario con el que se trabaja
     */
    public UsuarioBD(Usuario usuario) {
        this.usuario = usuario;
    }

    /**Añade el usuario en la base de datos*/
    public void anadir() {
        anadirEnBD(usuario);
    }

    /**
     *Indica si existe ya un usuario con ese correo electrónico.
     * @return boolean.
     * True si existe ya el correo electrónico
     */
    public boolean existeUsuario() {
        boolean res;
        String correoUsuario = usuario.getCorreo();
        //Sentencia hql
        String query = "FROM Usuario WHERE correo=:correo";
        //Diccionario con los parámetros de la query
        Hashtable<String, Object> ht = new Hashtable<String, Object>();
        ht.put("correo", correoUsuario);
        //llama a método de la clase padre
        res = existeEn(query, ht);
        return res;
    }

    /**
     *Función que indica si se han introducido correctamente los datos del registro
     * @return boolean
     * True si el usuario y el password son correctos
     */
    public boolean registrado() {

        boolean res;
        //capturamos el correo y el password del usuario
        String correoUsuario = usuario.getCorreo();
        String pass = usuario.getContrasena();
        //Creamos la sentencia hql
        String query = "FROM Usuario WHERE correo=:correo AND contrasena=:contrasena";
        //Creamos un diccionario con los parámetros de la query
        Hashtable<String, Object> ht = new Hashtable<String, Object>();
        ht.put("correo", correoUsuario);
        ht.put("contrasena", pass);
        //llamamos a método de la clase padre
        res = existeEn(query, ht);
        return res;
    }

    /**
     *Obtiene el usuario con el correo y password seleccionados
     * @return Usuario
     * Objeto de la clase usuario con todos los datos del usuario indicado por el correo
     */
    public Usuario recuperaUsuario() {

        List<Object> lista;
        //Capturamos el correo y el pass
        String correoUsuario = usuario.getCorreo();
        String pass = usuario.getContrasena();
        //Creamos la sentencia hql
        String query = "FROM Usuario WHERE correo=:correo AND contrasena=:contrasena";
        //Creamos un diccionario con los parámetros de la query
        Hashtable<String, Object> ht = new Hashtable<String, Object>();
        ht.put("correo", correoUsuario);
        ht.put("contrasena", pass);
        //Capturamos una lista con los resultados devueltos
        lista = devuelveDatos(query, ht);
        try {
            //tomamos el primero pues solo existe uno.
            usuario = (Usuario) lista.get(0);
        } catch (NullPointerException ne) {
        }
        return usuario;
    }

    /**
     *Devuelve el nodo perteneciente al usuario
     * @return Nodo
     * nodo que pertenece al usuario
     */
    public Nodo recuperarNodo() {

        Nodo nodo = null;
        List<Object> lista;
        //Capturamos el id del nodo
        long id = usuario.getNodo().getIdNodo();


        try {
            //Creamos sentencia hql
            String query = "FROM Nodo WHERE idNodo = :idNodo";
            //Creamos el diccionario con los parámetros de la query
            Hashtable<String, Object> ht = new Hashtable<String, Object>();
            ht.put("idNodo", id);
            //recuperamos todos los resultados y nos quedamos con el primero y único
            lista = devuelveDatos(query, ht);
            nodo = (Nodo) lista.get(0);
        } catch (NullPointerException npe) {
        }
        return nodo;
    }
}
